package com.back.controller;

import com.back.common.utils.Result;
import com.back.security.annotation.RequireRole;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 权限测试控制器
 * 提供各种权限测试接口
 */
@RestController
@RequestMapping("/auth-test")
@Api(tags = "权限测试接口")
@Slf4j
public class AuthTestController {

    /**
     * 所有认证用户都可以访问
     */
    @ApiOperation(value = "认证用户测试")
    @GetMapping("/authenticated")
    public Result authenticatedTest() {
        return Result.ok().message("您已认证，可以访问该资源");
    }

    /**
     * 只有管理员可以访问（使用Spring Security注解）
     */
    @ApiOperation(value = "管理员测试(Security)")
    @GetMapping("/admin-only-security")
    @PreAuthorize("hasRole('ADMIN')")
    public Result adminOnlySecurity() {
        return Result.ok().message("您是管理员，可以访问该资源");
    }

    /**
     * 只有管理员可以访问（使用自定义注解）
     */
    @ApiOperation(value = "管理员测试(自定义)")
    @GetMapping("/admin-only-custom")
    @RequireRole("ADMIN")
    public Result adminOnlyCustom() {
        return Result.ok().message("您是管理员，可以访问该资源(自定义注解)");
    }

    /**
     * 只有求职者可以访问
     */
    @ApiOperation(value = "求职者测试")
    @GetMapping("/jobseeker-only")
    @RequireRole("JOB_SEEKER")
    public Result jobSeekerOnly() {
        return Result.ok().message("您是求职者，可以访问该资源");
    }

    /**
     * 只有企业招聘人员可以访问
     */
    @ApiOperation(value = "企业招聘人员测试")
    @GetMapping("/employer-only")
    @RequireRole("EMPLOYER")
    public Result employerOnly() {
        return Result.ok().message("您是企业招聘人员，可以访问该资源");
    }

    /**
     * 管理员或企业招聘人员可以访问
     */
    @ApiOperation(value = "管理员或企业测试")
    @GetMapping("/admin-or-employer")
    @RequireRole({"ADMIN", "EMPLOYER"})
    public Result adminOrEmployer() {
        return Result.ok().message("您是管理员或企业招聘人员，可以访问该资源");
    }

    /**
     * 必须同时拥有管理员和企业招聘人员角色才能访问
     * 注意：在实际应用中，一个用户通常只会有一个角色，此接口仅用于测试
     */
    @ApiOperation(value = "管理员和企业测试")
    @GetMapping("/admin-and-employer")
    @RequireRole(value = {"ADMIN", "EMPLOYER"}, allRolesRequired = true)
    public Result adminAndEmployer() {
        return Result.ok().message("您同时拥有管理员和企业招聘人员角色，可以访问该资源");
    }
} 